import base64
import pickle

from django_redis import get_redis_connection


def merge_cart_cookie_to_redis(request, user, response):
    """
    用户登录合并cookie中的购物车数据到redis
    :param request: 请求体
    :param user: 用户对象
    :param response: 响应体
    :return: 返回响应体
    """
    # 取出cookie中的购物车数据
    cart_cookie = request.COOKIES.get('cart')
    # 如果没有cookie直接返回响应
    if not cart_cookie:
        return response

    # 解码
    cookie_cart_dict = pickle.loads(base64.b64decode(cart_cookie))
    # 组织新字典来存放购物车数据
    new_cart_dict = {}
    # 被选中的商品id列表
    new_cart_selected_add = []
    # 没有被选中的商品id列表
    new_cart_selected_rm = []
    # 遍历cookie购物车数据存放到新字典
    for sku_id, count_sel in cookie_cart_dict.items():
        new_cart_dict[sku_id] = count_sel['count']
        # 如果选中了就添加到add列表 没有被选中就添加到rm列表
        if count_sel['selected']:
            new_cart_selected_add.append(sku_id)
        else:
            new_cart_selected_rm.append(sku_id)

    # 连接redis
    redis_conn = get_redis_connection('carts')
    # 创建管道
    pl = redis_conn.pipeline()
    # 把cookie中的购物车数据添加到redis中
    pl.hmset('cart_%s' % user.id, new_cart_dict)
    # 选中数据中添加被选中的商品
    if new_cart_selected_add:
        pl.sadd('selected_%s' % user.id, *new_cart_selected_add)
    # 选中数据中删除没有被选中的商品
    if new_cart_selected_rm:
        pl.srem('selected_%s' % user.id, *new_cart_selected_rm)
    # 提交操作
    pl.execute()
    # 删除cookie中的购物车数据
    response.delete_cookie('cart')
    # 返回响应
    return response
